#ifndef LQUEUE_H_INCLUDED
#define LQUEUE_H_INCLUDED

#include <stdio.h>
#include <malloc.h>
#include <string.h>

typedef struct qnode
{
    char data;
    struct qnode *next;
};
typedef struct qnode qnode;
typedef struct qnode *qll; // sll指的是QueueLinkList

void Qinitiate(qll qh) // qh指的是QueueHead
{
    qh = (qll)malloc(sizeof(qnode));
    qh->next = nullptr;
}

/*****利用尾插法，将字符串存储进链表中，形成队列，然后可以逐次处理头结点*****/
void Qappend(qll qh, char str[])
{
    int i = 0;
    int l = strlen(str);
    qll p = qh; // p是游动的指针

    while (i <= l - 1)
    {
        qll t = (qll)malloc(sizeof(qnode)); // t是每次放到尾部的结点
        t->data = str[i];                   // 把本轮的字符赋给t的数据域
        t->next = nullptr;                  // t始终在尾部，所以指针域必须为空
        p->next = t;                        // 把原先的尾结点和t连起来
        p = t;                              // t成为新的尾结点，p指向这个新的尾结点
        t = nullptr;                        // t指向空
        free(t);                            // 释放掉t，下一轮中重新定义
        i = i + 1;
    }
}
/*****利用尾插法，将字符串存储进链表中，形成队列，然后可以逐次处理头结点*****/

/*****类似于栈的pop，获取除头结点外第一个结点的值并改变头结点*****/
char Qdelete(qll qh)
{
    if (qh->next == nullptr)
    {
        printf("队列已空！\n");
        return '\0';
    }
    else
    {
        qll p = qh->next;
        qh->next = p->next;
        return p->data;
    }
}
/*****类似于栈的pop，获取除头结点外第一个结点的值并改变头结点*****/

void printq(qll qh)
{
    qll p = qh->next;
    while (p != nullptr)
    {
        printf("%c", p->data);
        p = p->next;
    }
    free(p);
}

#endif